/*
 * rtc.c - Mokri
 * Contributors: xMine
 * (Any new Contributor may add himself/herself to the list)
 * Changes and fixes to be made:
 */

#include "rtc.h"

/* Ändert etwas im RTC Ram - der ganze 64Byte groß ist :D
 * Parameter: Position im Ram, Neuer Wert
 * Rückgaben: Keine
 */
void rtc_write (unsigned char position, unsigned char wert) {
	asm volatile ("out %%al, $0x70\n" /* Anfrage senden */
		      "mov %%bl, %%al\n"  /* bl -> al */
		      "out %%al, $0x71\n" /* Wert senden */
		      :
		      : "a"(position), "b" (wert)
		      );
}

/* Liest einen Eintrag aus dem RTC Ram
 * Parameter: Position im Ram
 * Rückgaben: Wert der Position
 */
unsigned char rtc_read (unsigned char position) {
	unsigned char wert;
	asm volatile ("out %%al, $0x70\n" /* Anfrage senden */
		      "in $0x71, %%al\n"  /* Antwort holen */
		      : "=a"(wert)        /* Ausgabe */
		      : "a"(position)     /* Eingabe */
		      );
	return wert;
}

/* Konvertiert eine GEPACKTE-BCD Zahl in einen int um
 * Parameter: char mit der Zahl in BCD notation
 * Rückgaben: Binäre zahl
 */
int convertbcd (unsigned char bcd) {
	return (bcd & 0xF) + (bcd >> 4) * 10;
}

/* Liest die aktuelle Sekunde aus
 * Parameter: Keine
 * Rückgaben: Sekunde der aktuellen Minute
 */
int rtc_seconds () {
	return convertbcd(rtc_read (0));
}

/* Liest die aktuelle Minute aus
 * Parameter: Keine
 * Rückgaben: Minute der aktuellen Stunde
 */
int rtc_minutes () {
	return convertbcd(rtc_read (2));
}

/* Liest die aktuelle Stunde aus
 * Parameter: Keine
 * Rückgaben: Stunde des aktuellen Tages
 */
int rtc_hours () {
	return convertbcd(rtc_read (4));
}

/* Liest den aktuellen Wochentag aus
 * Parameter: Keine
 * Rückgaben: Wochentag
 */
int rtc_weekday () {
	return convertbcd(rtc_read (6));
}

/* Liest den aktuellen Tag im aktuellen Monat aus
 * Parameter: Keine
 * Rückgaben: Tag des Monats
 */
int rtc_day () {
	return convertbcd(rtc_read (7));
}

/* Liest den aktuellen Monat aus
 * Parameter: Keine
 * Rückgaben: Monat
 */
int rtc_month () {
	return convertbcd(rtc_read (8));
}

/* Liest das aktuelle Jahr aus
 * Parameter: Keine
 * Rückgaben: Jahr (2-stellig)
 */
int rtc_year () {
	return convertbcd(rtc_read (9));
}
